home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / ciaplayer.lha / CIAplayer.s < prev    next >
Encoding:
Text File  |  1980-01-01  |  23.1 KB  |  1,248 lines

  1.  
  2.     section    CIAPlayer,code
  3.  
  4.     opt    d+
  5.     
  6.     ; Written by Shagratt/LSD. This player is a modified
  7.     ; version of the one used in "JESUS ON Es". And
  8.     ; the one now used in Grapevine.
  9.     
  10.     ; this is a cia player that works on all processors
  11.     ; thanx to Ozrik/Aslym for help with this.
  12.     
  13.     Move.w    #$a000,$dff09a    ; enable level 6 int
  14.  
  15.     move.l    4,a6        ; execbase
  16.     move.b    530(a6),d0        ; execbase VBLANK_FREQUENCY
  17.  
  18.     MOVE.L    #1773447,D7     ; PAL CIA TIME
  19.     
  20.     cmp.b    #50,d0        ; check if 50hz
  21.     beq    _pal            
  22.     
  23.     MOVE.L    #1789773,D7     ; NTSC CIA TIME
  24.  
  25. _pal:    move.l    d7,deftime
  26.  
  27.     divu    #125,D7         ; Default to normal 50 Hz timer
  28.     move.w    d7,ciatime
  29.  
  30.     bsr    GetVBR
  31.  
  32.     move.l    $78(a4),old        ; store old level 6
  33.     move.l    #l6int,$78(a4)    ; install my level 6
  34.  
  35.     move.b    #$7f,$bfdd00    ; all cia timers off
  36.     move.b    #%00010001,$bfde00    ; cra
  37.     move.b    #%10000001,$bfdd00    ; icr
  38.  
  39.     move.w    ciatime,d7        ; set up CIA timers
  40.     MOVE.B    d7,$bfd400
  41.     LSR.W    #8,D7
  42.     MOVE.B    d7,$bfd500
  43.  
  44.     bsr    mt_init
  45.     st    mt_enable        ; music on
  46.  
  47. loop:    btst    #6,$bfe001
  48.     bne    loop
  49.  
  50.     bsr    mt_end
  51.     
  52.     bsr    GetVBR
  53.     move.l    old,$78(a4)        ; restore old level 6
  54.     
  55.     moveq    #0,d0
  56.     rts
  57.     
  58.     *------------------------------------------*
  59.     
  60. l6int:    move.w    #$2000,$dff09c    ; serviced interupt
  61.     tst.b    $bfdd00        ; restart timers
  62.  
  63.     ; why does it call twice?
  64.  
  65.     add.b    #1,counter
  66.     btst.b    #0,counter
  67.     bne    .not
  68.     
  69.     move.w    #$f00,$dff180
  70.  
  71.     bsr    mt_music
  72.  
  73.     move.w    #$aaa,$dff180
  74.  
  75. .not    rte
  76.  
  77.     *------------------------------------------*
  78.  
  79. GetVBR    Move.l    4.w,A6
  80.     Moveq    #15,D7
  81.     And    296(A6),D7        ;check processor
  82.     Beq    .68000
  83.     Lea    .Find(Pc),A5
  84.     Jsr    -30(A6)        ;supervisor
  85. .68000    Move.l    D7,a4
  86.     Rts
  87.  
  88. .Find    dc.l    $4e7a7801        ;Movec.l    VBR,D7
  89.     Rte
  90.  
  91.     *------------------------------------------*
  92.  
  93. ciatime:        dc.l    0
  94. deftime:        dc.l    0
  95. old:        dc.l    0
  96. counter:        dc.w    0
  97. pt_signal:        dc.w    0
  98. pt_signo:        dc.l    0
  99. pt_pos:        dc.w    0
  100.  
  101. OzDMA    = 6
  102.  
  103.     ;---- Tempo ----
  104.  
  105. SetTempo    cmp.w    #32,d0
  106.     bhs.s    setemsk
  107.     moveq    #32,d0
  108. setemsk    move.w    d0,realtempo
  109.  
  110.     move.l    deftime,d2
  111.     divu    d0,d2
  112.  
  113.     move.w    d2,ciatime
  114.  
  115.     move.b    d2,$bfd400
  116.     lsr.w    #8,d2
  117.     move.b    d2,$bfd500
  118.     rts
  119.  
  120. RealTempo    dc.w    125
  121.  
  122. n_note        EQU    0  ; W
  123. n_cmd        EQU    2  ; W
  124. n_cmdlo        EQU    3  ; B
  125. n_start        EQU    4  ; L
  126. n_length        EQU    8  ; W
  127. n_loopstart        EQU    10 ; L
  128. n_replen        EQU    14 ; W
  129. n_period        EQU    16 ; W
  130. n_finetune        EQU    18 ; B
  131. n_volume        EQU    19 ; B
  132. n_dmabit        EQU    20 ; W
  133. n_toneportdirec    EQU    22 ; B
  134. n_toneportspeed    EQU    23 ; B
  135. n_wantedperiod    EQU    24 ; W
  136. n_vibratocmd    EQU    26 ; B
  137. n_vibratopos    EQU    27 ; B
  138. n_tremolocmd    EQU    28 ; B
  139. n_tremolopos    EQU    29 ; B
  140. n_wavecontrol    EQU    30 ; B
  141. n_glissfunk        EQU    31 ; B
  142. n_sampleoffset    EQU    32 ; B
  143. n_pattpos        EQU    33 ; B
  144. n_loopcount        EQU    34 ; B
  145. n_funkoffset    EQU    35 ; B
  146. n_wavestart        EQU    36 ; L
  147. n_reallength    EQU    40 ; W
  148.  
  149.     *-----------------------------*
  150.  
  151. mt_WaitDMA    movem.l    d0-d7,-(a7)
  152.  
  153.     Move.b    $dff006,D0
  154.     Addq.b    #OzDMA,D0
  155. .loop    Move.b    $dff006,D1
  156.     Cmp.b    D1,D0
  157.     Bgt.s    .loop
  158.  
  159.     movem.l    (a7)+,d0-d7    
  160.     rts
  161.  
  162.     *-----------------------------*
  163.  
  164. mt_init    lea    mt_data,A0
  165.     MOVE.L    A0,mt_SongDataPtr
  166.     MOVE.L    A0,A1
  167.     LEA    952(A1),A1
  168.     MOVEQ    #127,D0
  169.     MOVEQ    #0,D1
  170. mtloop    MOVE.L    D1,D2
  171.     SUBQ.W    #1,D0
  172. mtloop2    MOVE.B    (A1)+,D1
  173.     CMP.B    D2,D1
  174.     BGT.S    mtloop
  175.     DBRA    D0,mtloop2
  176.     ADDQ.B    #1,D2
  177.             
  178.     LEA    mt_SampleStarts(PC),A1
  179.     ASL.L    #8,D2
  180.     ASL.L    #2,D2
  181.     ADD.L    #1084,D2
  182.     ADD.L    A0,D2
  183.     MOVE.L    D2,A2
  184.     MOVEQ    #30,D0
  185. mtloop3    CLR.L    (A2)
  186.     MOVE.L    A2,(A1)+
  187.     MOVEQ    #0,D1
  188.     MOVE.W    42(A0),D1
  189.     ASL.L    #1,D1
  190.     ADD.L    D1,A2
  191.     ADD.L    #30,A0
  192.     DBRA    D0,mtloop3
  193.  
  194.     OR.B    #2,$BFE001
  195.     MOVE.B    #6,mt_speed
  196.     CLR.B    mt_counter
  197.     CLR.B    mt_SongPos
  198.     CLR.W    mt_PatternPos
  199. mt_end    SF    mt_Enable
  200.     LEA    $DFF000,A0
  201.     CLR.W    $A8(A0)
  202.     CLR.W    $B8(A0)
  203.     CLR.W    $C8(A0)
  204.     CLR.W    $D8(A0)
  205.     MOVE.W    #$F,$DFF096
  206.     RTS
  207.  
  208. mt_music
  209.     MOVEM.L    D0-D4/A0-A6,-(SP)
  210.     TST.B    mt_Enable
  211.     BEQ    mt_exit
  212.     ADDQ.B    #1,mt_counter
  213.     MOVE.B    mt_counter(PC),D0
  214.     CMP.B    mt_speed(PC),D0
  215.     BLO.S    mt_NoNewNote
  216.     CLR.B    mt_counter
  217.     TST.B    mt_PattDelTime2
  218.     BEQ.S    mt_GetNewNote
  219.     BSR.S    mt_NoNewAllChannels
  220.     BRA    mt_dskip
  221.  
  222. mt_NoNewNote
  223.     BSR.S    mt_NoNewAllChannels
  224.     BRA    mt_NoNewPosYet
  225.  
  226. mt_NoNewAllChannels
  227.     LEA    $DFF0A0,A5
  228.     LEA    mt_chan1temp(PC),A6
  229.     BSR    mt_CheckEfx
  230.     LEA    $DFF0B0,A5
  231.     LEA    mt_chan2temp(PC),A6
  232.     BSR    mt_CheckEfx
  233.     LEA    $DFF0C0,A5
  234.     LEA    mt_chan3temp(PC),A6
  235.     BSR    mt_CheckEfx
  236.     LEA    $DFF0D0,A5
  237.     LEA    mt_chan4temp(PC),A6
  238.     BRA    mt_CheckEfx
  239.  
  240. mt_GetNewNote
  241.     MOVE.L    mt_SongDataPtr(PC),A0
  242.     LEA    12(A0),A3
  243.     LEA    952(A0),A2            ;pattpo
  244.     LEA    1084(A0),A0            ;patterndata
  245.     MOVEQ    #0,D0
  246.     MOVEQ    #0,D1
  247.     MOVE.B    mt_SongPos(PC),D0
  248.     MOVE.B    (A2,D0.W),D1
  249.     ASL.L    #8,D1
  250.     ASL.L    #2,D1
  251.     ADD.W    mt_PatternPos(PC),D1
  252.     CLR.W    mt_DMACONtemp
  253.  
  254.     LEA    $DFF0A0,A5
  255.     LEA    mt_chan1temp(PC),A6
  256.     BSR    mt_PlayVoice
  257.     
  258.     LEA    $DFF0B0,A5
  259.     LEA    mt_chan2temp(PC),A6
  260.     BSR.S    mt_PlayVoice
  261.     
  262.     LEA    $DFF0C0,A5
  263.     LEA    mt_chan3temp(PC),A6
  264.     BSR.S    mt_PlayVoice
  265.     
  266.     LEA    $DFF0D0,A5
  267.     LEA    mt_chan4temp(PC),A6
  268.     BSR.S    mt_PlayVoice
  269.  
  270.     BRA    mt_SetDMA
  271.  
  272. mt_PlayVoice
  273.     TST.L    (A6)
  274.     BNE.S    mt_plvskip
  275.     BSR    mt_PerNop
  276. mt_plvskip    MOVE.L    (A0,D1.L),(A6)
  277.     ADDQ.L    #4,D1
  278.     MOVEQ    #0,D2
  279.     MOVE.B    n_cmd(A6),D2
  280.     AND.B    #$F0,D2
  281.     LSR.B    #4,D2
  282.     MOVE.B    (A6),D0
  283.     AND.B    #$F0,D0
  284.     OR.B    D0,D2
  285.     TST.B    D2
  286.     BEQ    mt_SetRegs
  287.     MOVEQ    #0,D3
  288.     LEA    mt_SampleStarts(PC),A1
  289.     MOVE    D2,D4
  290.     SUBQ.L    #1,D2
  291.     ASL.L    #2,D2
  292.     MULU    #30,D4
  293.     MOVE.L    (A1,D2.L),n_start(A6)
  294.     MOVE.W    (A3,D4.L),n_length(A6)
  295.     MOVE.W    (A3,D4.L),n_reallength(A6)
  296.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  297.     MOVE.B    3(A3,D4.L),n_volume(A6)
  298.  
  299.     MOVE.W    4(A3,D4.L),D3         ; Get repeat
  300.     TST.W    D3
  301.     BEQ.S    mt_NoLoop
  302.     MOVE.L    n_start(A6),D2        ; Get start
  303.     ASL.W    #1,D3
  304.     ADD.L    D3,D2            ; Add repeat
  305.     MOVE.L    D2,n_loopstart(A6)
  306.     MOVE.L    D2,n_wavestart(A6)
  307.     MOVE.W    4(A3,D4.L),D0        ; Get repeat
  308.     ADD.W    6(A3,D4.L),D0        ; Add replen
  309.     MOVE.W    D0,n_length(A6)
  310.     MOVE.W    6(A3,D4.L),n_replen(A6)        ; Save replen
  311.     MOVEQ    #0,D0
  312.     MOVE.B    n_volume(A6),D0
  313.     MOVE.W    D0,8(A5)            ; Set volume
  314.     BRA.S    mt_SetRegs
  315.  
  316. mt_NoLoop    MOVE.L    n_start(A6),D2
  317.     ADD.L    D3,D2
  318.     MOVE.L    D2,n_loopstart(A6)
  319.     MOVE.L    D2,n_wavestart(A6)
  320.     MOVE.W    6(A3,D4.L),n_replen(A6)        ; Save replen
  321.     MOVEQ    #0,D0
  322.     MOVE.B    n_volume(A6),D0
  323.     MOVE.W    D0,8(A5)            ; Set volume
  324. mt_SetRegs    MOVE.W    (A6),D0
  325.     AND.W    #$0FFF,D0
  326.     BEQ    mt_CheckMoreEfx        ; If no note
  327.     MOVE.W    2(A6),D0
  328.     AND.W    #$0FF0,D0
  329.     CMP.W    #$0E50,D0
  330.     BEQ.S    mt_DoSetFineTune
  331.     MOVE.B    2(A6),D0
  332.     AND.B    #$0F,D0
  333.     CMP.B    #3,D0            ; TonePortamento
  334.     BEQ.S    mt_ChkTonePorta
  335.     CMP.B    #5,D0
  336.     BEQ.S    mt_ChkTonePorta
  337.     CMP.B    #9,D0            ; Sample Offset
  338.     BNE.S    mt_SetPeriod
  339.     BSR    mt_CheckMoreEfx
  340.     BRA.S    mt_SetPeriod
  341.  
  342. mt_DoSetFineTune
  343.     BSR    mt_SetFineTune
  344.     BRA.S    mt_SetPeriod
  345.  
  346. mt_ChkTonePorta
  347.     BSR    mt_SetTonePorta
  348.     BRA    mt_CheckMoreEfx
  349.  
  350. mt_SetPeriod
  351.     MOVEM.L    D0-D1/A0-A1,-(SP)
  352.     MOVE.W    (A6),D1
  353.     AND.W    #$0FFF,D1
  354.     LEA    mt_PeriodTable(PC),A1
  355.     MOVEQ    #0,D0
  356.     MOVEQ    #36,D2
  357. mt_ftuloop    CMP.W    (A1,D0.W),D1
  358.     BHS.S    mt_ftufound
  359.     ADDQ.L    #2,D0
  360.     DBRA    D2,mt_ftuloop
  361. mt_ftufound    MOVEQ    #0,D1
  362.     MOVE.B    n_finetune(A6),D1
  363.     MULU    #36*2,D1
  364.     ADD.L    D1,A1
  365.     MOVE.W    (A1,D0.W),n_period(A6)
  366.     MOVEM.L    (SP)+,D0-D1/A0-A1
  367.  
  368.     MOVE.W    2(A6),D0
  369.     AND.W    #$0FF0,D0
  370.     CMP.W    #$0ED0,D0 ; Notedelay
  371.     BEQ    mt_CheckMoreEfx
  372.  
  373.     MOVE.W    n_dmabit(A6),$DFF096
  374.     BTST    #2,n_wavecontrol(A6)
  375.     BNE.S    mt_vibnoc
  376.     CLR.B    n_vibratopos(A6)
  377. mt_vibnoc    BTST    #6,n_wavecontrol(A6)
  378.     BNE.S    mt_trenoc
  379.     CLR.B    n_tremolopos(A6)
  380. mt_trenoc    MOVE.L    n_start(A6),(A5)        ; Set start
  381.     MOVE.W    n_length(A6),4(A5)        ; Set length
  382.     MOVE.W    n_period(A6),D0
  383.     MOVE.W    D0,6(A5)            ; Set period
  384.     MOVE.W    n_dmabit(A6),D0
  385.     OR.W    D0,mt_DMACONtemp
  386.     BRA    mt_CheckMoreEfx
  387.  
  388. mt_SetDMA    bsr    mt_WaitDMA
  389.  
  390.     MOVE.W    mt_DMACONtemp(PC),D0
  391.     OR.W    #$8000,D0
  392.     MOVE.W    D0,$DFF096
  393.     
  394.     bsr    mt_WaitDMA
  395.  
  396.     LEA    $DFF000,A5
  397.     LEA    mt_chan4temp(PC),A6
  398.     MOVE.L    n_loopstart(A6),$D0(A5)
  399.     MOVE.W    n_replen(A6),$D4(A5)
  400.     LEA    mt_chan3temp(PC),A6
  401.     MOVE.L    n_loopstart(A6),$C0(A5)
  402.     MOVE.W    n_replen(A6),$C4(A5)
  403.     LEA    mt_chan2temp(PC),A6
  404.     MOVE.L    n_loopstart(A6),$B0(A5)
  405.     MOVE.W    n_replen(A6),$B4(A5)
  406.     LEA    mt_chan1temp(PC),A6
  407.     MOVE.L    n_loopstart(A6),$A0(A5)
  408.     MOVE.W    n_replen(A6),$A4(A5)
  409.  
  410. mt_dskip    ADD.W    #16,mt_PatternPos
  411.     MOVE.B    mt_PattDelTime,D0
  412.     BEQ.S    mt_dskc
  413.     MOVE.B    D0,mt_PattDelTime2
  414.     CLR.B    mt_PattDelTime
  415. mt_dskc    TST.B    mt_PattDelTime2
  416.     BEQ.S    mt_dska
  417.     SUBQ.B    #1,mt_PattDelTime2
  418.     BEQ.S    mt_dska
  419.     SUB.W    #16,mt_PatternPos
  420. mt_dska    TST.B    mt_PBreakFlag
  421.     BEQ.S    mt_nnpysk
  422.     SF    mt_PBreakFlag
  423.     MOVEQ    #0,D0
  424.     MOVE.B    mt_PBreakPos(PC),D0
  425.     CLR.B    mt_PBreakPos
  426.     LSL.W    #4,D0
  427.     MOVE.W    D0,mt_PatternPos
  428. mt_nnpysk    CMP.W    #1024,mt_PatternPos
  429.     BLO.S    mt_NoNewPosYet
  430. mt_NextPosition    
  431.     MOVEQ    #0,D0
  432.     MOVE.B    mt_PBreakPos(PC),D0
  433.     LSL.W    #4,D0
  434.     MOVE.W    D0,mt_PatternPos
  435.     CLR.B    mt_PBreakPos
  436.     CLR.B    mt_PosJumpFlag
  437.     ADDQ.B    #1,mt_SongPos
  438.     AND.B    #$7F,mt_SongPos
  439.     MOVE.B    mt_SongPos(PC),D1
  440.     MOVE.L    mt_SongDataPtr(PC),A0
  441.     CMP.B    950(A0),D1
  442.     BLO.S    mt_NoNewPosYet
  443.     CLR.B    mt_SongPos
  444. mt_NoNewPosYet    
  445.     TST.B    mt_PosJumpFlag
  446.     BNE.S    mt_NextPosition
  447. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  448.     RTS
  449.  
  450. mt_CheckEfx    BSR    mt_UpdateFunk
  451.     MOVE.W    n_cmd(A6),D0
  452.     AND.W    #$0FFF,D0
  453.     BEQ    mt_PerNop
  454.     MOVE.B    n_cmd(A6),D0
  455.     AND.B    #$0F,D0
  456.     BEQ    mt_Arpeggio
  457.     CMP.B    #1,D0
  458.     BEQ    mt_PortaUp
  459.     CMP.B    #2,D0
  460.     BEQ    mt_PortaDown
  461.     CMP.B    #3,D0
  462.     BEQ    mt_TonePortamento
  463.     CMP.B    #4,D0
  464.     BEQ    mt_Vibrato
  465.     CMP.B    #5,D0
  466.     BEQ    mt_TonePlusVolSlide
  467.     CMP.B    #6,D0
  468.     BEQ    mt_VibratoPlusVolSlide
  469.     CMP.B    #$E,D0
  470.     BEQ    mt_E_Commands
  471. SetBack    MOVE.W    n_period(A6),6(A5)
  472.     CMP.B    #7,D0
  473.     BEQ    mt_Tremolo
  474.     CMP.B    #$A,D0
  475.     BEQ    mt_VolumeSlide
  476.     CMP.B    #8,D0
  477.     BEQ    mt_signal
  478.  
  479. mt_Return    RTS
  480.  
  481. mt_signal    st    pt_signal        ; JoEs used command 8 to change
  482.                 ; routines
  483.     moveq    #0,d0
  484.     MOVE.B    n_cmdlo(A6),d0
  485.     asl.l    #2,d0
  486.     move.l    d0,pt_signo        ; which comamnd
  487.     
  488.     move.b    mt_counter,pt_pos
  489.     ;move.w    $dff006,$dff180
  490.     
  491.     rts
  492.  
  493. mt_PerNop    MOVE.W    n_period(A6),6(A5)
  494.     RTS
  495.  
  496. mt_Arpeggio
  497.     MOVEQ    #0,D0
  498.     MOVE.B    mt_counter(PC),D0
  499.     DIVS    #3,D0
  500.     SWAP    D0
  501.     CMP.W    #0,D0
  502.     BEQ.S    mt_Arpeggio2
  503.     CMP.W    #2,D0
  504.     BEQ.S    mt_Arpeggio1
  505.     MOVEQ    #0,D0
  506.     MOVE.B    n_cmdlo(A6),D0
  507.     LSR.B    #4,D0
  508.     BRA.S    mt_Arpeggio3
  509.  
  510. mt_Arpeggio1
  511.     MOVEQ    #0,D0
  512.     MOVE.B    n_cmdlo(A6),D0
  513.     AND.B    #15,D0
  514.     BRA.S    mt_Arpeggio3
  515.  
  516. mt_Arpeggio2
  517.     MOVE.W    n_period(A6),D2
  518.     BRA.S    mt_Arpeggio4
  519.  
  520. mt_Arpeggio3
  521.     ASL.W    #1,D0
  522.     MOVEQ    #0,D1
  523.     MOVE.B    n_finetune(A6),D1
  524.     MULU    #36*2,D1
  525.     LEA    mt_PeriodTable(PC),A0
  526.     ADD.L    D1,A0
  527.     MOVEQ    #0,D1
  528.     MOVE.W    n_period(A6),D1
  529.     MOVEQ    #36,D3
  530. mt_arploop    MOVE.W    (A0,D0.W),D2
  531.     CMP.W    (A0),D1
  532.     BHS.S    mt_Arpeggio4
  533.     ADDQ.L    #2,A0
  534.     DBRA    D3,mt_arploop
  535.     RTS
  536.  
  537. mt_Arpeggio4
  538.     MOVE.W    D2,6(A5)
  539.     RTS
  540.  
  541. mt_FinePortaUp
  542.     TST.B    mt_counter
  543.     BNE    mt_Return
  544.     MOVE.B    #$0F,mt_LowMask
  545. mt_PortaUp
  546.     MOVEQ    #0,D0
  547.     MOVE.B    n_cmdlo(A6),D0
  548.     AND.B    mt_LowMask(PC),D0
  549.     MOVE.B    #$FF,mt_LowMask
  550.     SUB.W    D0,n_period(A6)
  551.     MOVE.W    n_period(A6),D0
  552.     AND.W    #$0FFF,D0
  553.     CMP.W    #113,D0
  554.     BPL.S    mt_PortaUskip
  555.     AND.W    #$F000,n_period(A6)
  556.     OR.W    #113,n_period(A6)
  557. mt_PortaUskip
  558.     MOVE.W    n_period(A6),D0
  559.     AND.W    #$0FFF,D0
  560.     MOVE.W    D0,6(A5)
  561.     RTS    
  562.  
  563. mt_FinePortaDown
  564.     TST.B    mt_counter
  565.     BNE    mt_Return
  566.     MOVE.B    #$0F,mt_LowMask
  567. mt_PortaDown
  568.     CLR.W    D0
  569.     MOVE.B    n_cmdlo(A6),D0
  570.     AND.B    mt_LowMask(PC),D0
  571.     MOVE.B    #$FF,mt_LowMask
  572.     ADD.W    D0,n_period(A6)
  573.     MOVE.W    n_period(A6),D0
  574.     AND.W    #$0FFF,D0
  575.     CMP.W    #856,D0
  576.     BMI.S    mt_PortaDskip
  577.     AND.W    #$F000,n_period(A6)
  578.     OR.W    #856,n_period(A6)
  579. mt_PortaDskip
  580.     MOVE.W    n_period(A6),D0
  581.     AND.W    #$0FFF,D0
  582.     MOVE.W    D0,6(A5)
  583.     RTS
  584.  
  585. mt_SetTonePorta
  586.     MOVE.L    A0,-(SP)
  587.     MOVE.W    (A6),D2
  588.     AND.W    #$0FFF,D2
  589.     MOVEQ    #0,D0
  590.     MOVE.B    n_finetune(A6),D0
  591.     MULU    #37*2,D0
  592.     LEA    mt_PeriodTable(PC),A0
  593.     ADD.L    D0,A0
  594.     MOVEQ    #0,D0
  595. mt_StpLoop
  596.     CMP.W    (A0,D0.W),D2
  597.     BHS.S    mt_StpFound
  598.     ADDQ.W    #2,D0
  599.     CMP.W    #37*2,D0
  600.     BLO.S    mt_StpLoop
  601.     MOVEQ    #35*2,D0
  602. mt_StpFound
  603.     MOVE.B    n_finetune(A6),D2
  604.     AND.B    #8,D2
  605.     BEQ.S    mt_StpGoss
  606.     TST.W    D0
  607.     BEQ.S    mt_StpGoss
  608.     SUBQ.W    #2,D0
  609. mt_StpGoss
  610.     MOVE.W    (A0,D0.W),D2
  611.     MOVE.L    (SP)+,A0
  612.     MOVE.W    D2,n_wantedperiod(A6)
  613.     MOVE.W    n_period(A6),D0
  614.     CLR.B    n_toneportdirec(A6)
  615.     CMP.W    D0,D2
  616.     BEQ.S    mt_ClearTonePorta
  617.     BGE    mt_Return
  618.     MOVE.B    #1,n_toneportdirec(A6)
  619.     RTS
  620.  
  621. mt_ClearTonePorta
  622.     CLR.W    n_wantedperiod(A6)
  623.     RTS
  624.  
  625. mt_TonePortamento
  626.     MOVE.B    n_cmdlo(A6),D0
  627.     BEQ.S    mt_TonePortNoChange
  628.     MOVE.B    D0,n_toneportspeed(A6)
  629.     CLR.B    n_cmdlo(A6)
  630. mt_TonePortNoChange
  631.     TST.W    n_wantedperiod(A6)
  632.     BEQ    mt_Return
  633.     MOVEQ    #0,D0
  634.     MOVE.B    n_toneportspeed(A6),D0
  635.     TST.B    n_toneportdirec(A6)
  636.     BNE.S    mt_TonePortaUp
  637. mt_TonePortaDown
  638.     ADD.W    D0,n_period(A6)
  639.     MOVE.W    n_wantedperiod(A6),D0
  640.     CMP.W    n_period(A6),D0
  641.     BGT.S    mt_TonePortaSetPer
  642.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  643.     CLR.W    n_wantedperiod(A6)
  644.     BRA.S    mt_TonePortaSetPer
  645.  
  646. mt_TonePortaUp
  647.     SUB.W    D0,n_period(A6)
  648.     MOVE.W    n_wantedperiod(A6),D0
  649.     CMP.W    n_period(A6),D0
  650.     BLT.S    mt_TonePortaSetPer
  651.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  652.     CLR.W    n_wantedperiod(A6)
  653.  
  654. mt_TonePortaSetPer
  655.     MOVE.W    n_period(A6),D2
  656.     MOVE.B    n_glissfunk(A6),D0
  657.     AND.B    #$0F,D0
  658.     BEQ.S    mt_GlissSkip
  659.     MOVEQ    #0,D0
  660.     MOVE.B    n_finetune(A6),D0
  661.     MULU    #36*2,D0
  662.     LEA    mt_PeriodTable(PC),A0
  663.     ADD.L    D0,A0
  664.     MOVEQ    #0,D0
  665. mt_GlissLoop
  666.     CMP.W    (A0,D0.W),D2
  667.     BHS.S    mt_GlissFound
  668.     ADDQ.W    #2,D0
  669.     CMP.W    #36*2,D0
  670.     BLO.S    mt_GlissLoop
  671.     MOVEQ    #35*2,D0
  672. mt_GlissFound
  673.     MOVE.W    (A0,D0.W),D2
  674. mt_GlissSkip
  675.     MOVE.W    D2,6(A5) ; Set period
  676.     RTS
  677.  
  678. mt_Vibrato
  679.     MOVE.B    n_cmdlo(A6),D0
  680.     BEQ.S    mt_Vibrato2
  681.     MOVE.B    n_vibratocmd(A6),D2
  682.     AND.B    #$0F,D0
  683.     BEQ.S    mt_vibskip
  684.     AND.B    #$F0,D2
  685.     OR.B    D0,D2
  686. mt_vibskip
  687.     MOVE.B    n_cmdlo(A6),D0
  688.     AND.B    #$F0,D0
  689.     BEQ.S    mt_vibskip2
  690.     AND.B    #$0F,D2
  691.     OR.B    D0,D2
  692. mt_vibskip2
  693.     MOVE.B    D2,n_vibratocmd(A6)
  694. mt_Vibrato2
  695.     MOVE.B    n_vibratopos(A6),D0
  696.     LEA    mt_VibratoTable(PC),A4
  697.     LSR.W    #2,D0
  698.     AND.W    #$001F,D0
  699.     MOVEQ    #0,D2
  700.     MOVE.B    n_wavecontrol(A6),D2
  701.     AND.B    #$03,D2
  702.     BEQ.S    mt_vib_sine
  703.     LSL.B    #3,D0
  704.     CMP.B    #1,D2
  705.     BEQ.S    mt_vib_rampdown
  706.     MOVE.B    #255,D2
  707.     BRA.S    mt_vib_set
  708. mt_vib_rampdown
  709.     TST.B    n_vibratopos(A6)
  710.     BPL.S    mt_vib_rampdown2
  711.     MOVE.B    #255,D2
  712.     SUB.B    D0,D2
  713.     BRA.S    mt_vib_set
  714. mt_vib_rampdown2
  715.     MOVE.B    D0,D2
  716.     BRA.S    mt_vib_set
  717. mt_vib_sine
  718.     MOVE.B    (A4,D0.W),D2
  719. mt_vib_set
  720.     MOVE.B    n_vibratocmd(A6),D0
  721.     AND.W    #15,D0
  722.     MULU    D0,D2
  723.     LSR.W    #7,D2
  724.     MOVE.W    n_period(A6),D0
  725.     TST.B    n_vibratopos(A6)
  726.     BMI.S    mt_VibratoNeg
  727.     ADD.W    D2,D0
  728.     BRA.S    mt_Vibrato3
  729. mt_VibratoNeg
  730.     SUB.W    D2,D0
  731. mt_Vibrato3
  732.     MOVE.W    D0,6(A5)
  733.     MOVE.B    n_vibratocmd(A6),D0
  734.     LSR.W    #2,D0
  735.     AND.W    #$003C,D0
  736.     ADD.B    D0,n_vibratopos(A6)
  737.     RTS
  738.  
  739. mt_TonePlusVolSlide
  740.     BSR    mt_TonePortNoChange
  741.     BRA    mt_VolumeSlide
  742.  
  743. mt_VibratoPlusVolSlide
  744.     BSR.S    mt_Vibrato2
  745.     BRA    mt_VolumeSlide
  746.  
  747. mt_Tremolo    MOVE.B    n_cmdlo(A6),D0
  748.     BEQ.S    mt_Tremolo2
  749.     MOVE.B    n_tremolocmd(A6),D2
  750.     AND.B    #$0F,D0
  751.     BEQ.S    mt_treskip
  752.     AND.B    #$F0,D2
  753.     OR.B    D0,D2
  754. mt_treskip
  755.     MOVE.B    n_cmdlo(A6),D0
  756.     AND.B    #$F0,D0
  757.     BEQ.S    mt_treskip2
  758.     AND.B    #$0F,D2
  759.     OR.B    D0,D2
  760. mt_treskip2
  761.     MOVE.B    D2,n_tremolocmd(A6)
  762. mt_Tremolo2
  763.     MOVE.B    n_tremolopos(A6),D0
  764.     LEA    mt_VibratoTable(PC),A4
  765.     LSR.W    #2,D0
  766.     AND.W    #$001F,D0
  767.     MOVEQ    #0,D2
  768.     MOVE.B    n_wavecontrol(A6),D2
  769.     LSR.B    #4,D2
  770.     AND.B    #$03,D2
  771.     BEQ.S    mt_tre_sine
  772.     LSL.B    #3,D0
  773.     CMP.B    #1,D2
  774.     BEQ.S    mt_tre_rampdown
  775.     MOVE.B    #255,D2
  776.     BRA.S    mt_tre_set
  777. mt_tre_rampdown
  778.     TST.B    n_vibratopos(A6)
  779.     BPL.S    mt_tre_rampdown2
  780.     MOVE.B    #255,D2
  781.     SUB.B    D0,D2
  782.     BRA.S    mt_tre_set
  783. mt_tre_rampdown2
  784.     MOVE.B    D0,D2
  785.     BRA.S    mt_tre_set
  786. mt_tre_sine
  787.     MOVE.B    (A4,D0.W),D2
  788. mt_tre_set
  789.     MOVE.B    n_tremolocmd(A6),D0
  790.     AND.W    #15,D0
  791.     MULU    D0,D2
  792.     LSR.W    #6,D2
  793.     MOVEQ    #0,D0
  794.     MOVE.B    n_volume(A6),D0
  795.     TST.B    n_tremolopos(A6)
  796.     BMI.S    mt_TremoloNeg
  797.     ADD.W    D2,D0
  798.     BRA.S    mt_Tremolo3
  799. mt_TremoloNeg
  800.     SUB.W    D2,D0
  801. mt_Tremolo3
  802.     BPL.S    mt_TremoloSkip
  803.     CLR.W    D0
  804. mt_TremoloSkip
  805.     CMP.W    #$40,D0
  806.     BLS.S    mt_TremoloOk
  807.     MOVE.W    #$40,D0
  808. mt_TremoloOk
  809.     MOVE.W    D0,8(A5)
  810.     MOVE.B    n_tremolocmd(A6),D0
  811.     LSR.W    #2,D0
  812.     AND.W    #$003C,D0
  813.     ADD.B    D0,n_tremolopos(A6)
  814.     RTS
  815.  
  816. mt_SampleOffset
  817.     MOVEQ    #0,D0
  818.     MOVE.B    n_cmdlo(A6),D0
  819.     BEQ.S    mt_sononew
  820.     MOVE.B    D0,n_sampleoffset(A6)
  821. mt_sononew
  822.     MOVE.B    n_sampleoffset(A6),D0
  823.     LSL.W    #7,D0
  824.     CMP.W    n_length(A6),D0
  825.     BGE.S    mt_sofskip
  826.     SUB.W    D0,n_length(A6)
  827.     LSL.W    #1,D0
  828.     ADD.L    D0,n_start(A6)
  829.     RTS
  830. mt_sofskip    MOVE.W    #$0001,n_length(A6)
  831.     RTS
  832.  
  833. mt_VolumeSlide
  834.     MOVEQ    #0,D0
  835.     MOVE.B    n_cmdlo(A6),D0
  836.     LSR.B    #4,D0
  837.     TST.B    D0
  838.     BEQ.S    mt_VolSlideDown
  839. mt_VolSlideUp
  840.     ADD.B    D0,n_volume(A6)
  841.     CMP.B    #$40,n_volume(A6)
  842.     BMI.S    mt_vsuskip
  843.     MOVE.B    #$40,n_volume(A6)
  844. mt_vsuskip
  845.     MOVE.B    n_volume(A6),D0
  846.     MOVE.W    D0,8(A5)
  847.     RTS
  848.  
  849. mt_VolSlideDown
  850.     MOVEQ    #0,D0
  851.     MOVE.B    n_cmdlo(A6),D0
  852.     AND.B    #$0F,D0
  853. mt_VolSlideDown2
  854.     SUB.B    D0,n_volume(A6)
  855.     BPL.S    mt_vsdskip
  856.     CLR.B    n_volume(A6)
  857. mt_vsdskip    MOVE.B    n_volume(A6),D0
  858.     MOVE.W    D0,8(A5)
  859.     RTS
  860.  
  861. mt_PositionJump
  862.     MOVE.B    n_cmdlo(A6),D0
  863.     SUBQ.B    #1,D0
  864.     MOVE.B    D0,mt_SongPos
  865. mt_pj2    CLR.B    mt_PBreakPos
  866.     ST     mt_PosJumpFlag
  867.     RTS
  868.  
  869. mt_VolumeChange
  870.     MOVEQ    #0,D0
  871.     MOVE.B    n_cmdlo(A6),D0
  872.     CMP.B    #$40,D0
  873.     BLS.S    mt_VolumeOk
  874.     MOVEQ    #$40,D0
  875. mt_VolumeOk
  876.     MOVE.B    D0,n_volume(A6)
  877.     MOVE.W    D0,8(A5)
  878.     RTS
  879.  
  880. mt_PatternBreak
  881.     MOVEQ    #0,D0
  882.     MOVE.B    n_cmdlo(A6),D0
  883.     MOVE.L    D0,D2
  884.     LSR.B    #4,D0
  885.     MULU    #10,D0
  886.     AND.B    #$0F,D2
  887.     ADD.B    D2,D0
  888.     CMP.B    #63,D0
  889.     BHI.S    mt_pj2
  890.     MOVE.B    D0,mt_PBreakPos
  891.     ST    mt_PosJumpFlag
  892.     RTS
  893.  
  894. mt_SetSpeed
  895.     MOVEQ    #0,D0
  896.     MOVE.B    3(A6),D0
  897.     BEQ    mt_end
  898.     CMP.B    #32,D0
  899.     BHS    SetTempo
  900.     CLR.B    mt_counter
  901.     MOVE.B    D0,mt_speed
  902.     RTS
  903.  
  904.  
  905. mt_CheckMoreEfx
  906.     BSR    mt_UpdateFunk
  907.     MOVE.B    2(A6),D0
  908.     AND.B    #$0F,D0
  909.     CMP.B    #$9,D0
  910.     BEQ    mt_SampleOffset
  911.     CMP.B    #$B,D0
  912.     BEQ    mt_PositionJump
  913.     CMP.B    #$D,D0
  914.     BEQ    mt_PatternBreak
  915.     CMP.B    #$E,D0
  916.     BEQ.S    mt_E_Commands
  917.     CMP.B    #$F,D0
  918.     BEQ    mt_SetSpeed
  919.     CMP.B    #$C,D0
  920.     BEQ    mt_VolumeChange
  921.     BRA    mt_PerNop
  922.  
  923. mt_E_Commands
  924.     MOVE.B    n_cmdlo(A6),D0
  925.     AND.B    #$F0,D0
  926.     LSR.B    #4,D0
  927.     BEQ.S    mt_FilterOnOff
  928.     CMP.B    #1,D0
  929.     BEQ    mt_FinePortaUp
  930.     CMP.B    #2,D0
  931.     BEQ    mt_FinePortaDown
  932.     CMP.B    #3,D0
  933.     BEQ    mt_SetGlissControl
  934.     CMP.B    #4,D0
  935.     BEQ    mt_SetVibratoControl
  936.     CMP.B    #5,D0
  937.     BEQ    mt_SetFineTune
  938.     CMP.B    #6,D0
  939.     BEQ    mt_JumpLoop
  940.     CMP.B    #7,D0
  941.     BEQ    mt_SetTremoloControl
  942.     CMP.B    #9,D0
  943.     BEQ    mt_RetrigNote
  944.     CMP.B    #$A,D0
  945.     BEQ    mt_VolumeFineUp
  946.     CMP.B    #$B,D0
  947.     BEQ    mt_VolumeFineDown
  948.     CMP.B    #$C,D0
  949.     BEQ    mt_NoteCut
  950.     CMP.B    #$D,D0
  951.     BEQ    mt_NoteDelay
  952.     CMP.B    #$E,D0
  953.     BEQ    mt_PatternDelay
  954.     CMP.B    #$F,D0
  955.     BEQ    mt_FunkIt
  956.     RTS
  957.  
  958. mt_FilterOnOff
  959.     MOVE.B    n_cmdlo(A6),D0
  960.     AND.B    #1,D0
  961.     ASL.B    #1,D0
  962.     AND.B    #$FD,$BFE001
  963.     OR.B    D0,$BFE001
  964.     RTS    
  965.  
  966. mt_SetGlissControl
  967.     MOVE.B    n_cmdlo(A6),D0
  968.     AND.B    #$0F,D0
  969.     AND.B    #$F0,n_glissfunk(A6)
  970.     OR.B    D0,n_glissfunk(A6)
  971.     RTS
  972.  
  973. mt_SetVibratoControl
  974.     MOVE.B    n_cmdlo(A6),D0
  975.     AND.B    #$0F,D0
  976.     AND.B    #$F0,n_wavecontrol(A6)
  977.     OR.B    D0,n_wavecontrol(A6)
  978.     RTS
  979.  
  980. mt_SetFineTune
  981.     MOVE.B    n_cmdlo(A6),D0
  982.     AND.B    #$0F,D0
  983.     MOVE.B    D0,n_finetune(A6)
  984.     RTS
  985.  
  986. mt_JumpLoop
  987.     TST.B    mt_counter
  988.     BNE    mt_Return
  989.     MOVE.B    n_cmdlo(A6),D0
  990.     AND.B    #$0F,D0
  991.     BEQ.S    mt_SetLoop
  992.     TST.B    n_loopcount(A6)
  993.     BEQ.S    mt_jumpcnt
  994.     SUBQ.B    #1,n_loopcount(A6)
  995.     BEQ    mt_Return
  996. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  997.     ST    mt_PBreakFlag
  998.     RTS
  999.  
  1000. mt_jumpcnt    MOVE.B    D0,n_loopcount(A6)
  1001.     BRA.S    mt_jmploop
  1002.  
  1003. mt_SetLoop    MOVE.W    mt_PatternPos(PC),D0
  1004.     LSR.W    #4,D0
  1005.     MOVE.B    D0,n_pattpos(A6)
  1006.     RTS
  1007.  
  1008. mt_SetTremoloControl
  1009.     MOVE.B    n_cmdlo(A6),D0
  1010.     AND.B    #$0F,D0
  1011.     LSL.B    #4,D0
  1012.     AND.B    #$0F,n_wavecontrol(A6)
  1013.     OR.B    D0,n_wavecontrol(A6)
  1014.     RTS
  1015.  
  1016. mt_RetrigNote
  1017.     MOVE.L    D1,-(SP)
  1018.     MOVEQ    #0,D0
  1019.     MOVE.B    n_cmdlo(A6),D0
  1020.     AND.B    #$0F,D0
  1021.     BEQ.S    mt_rtnend
  1022.     MOVEQ    #0,D1
  1023.     MOVE.B    mt_counter(PC),D1
  1024.     BNE.S    mt_rtnskp
  1025.     MOVE.W    (A6),D1
  1026.     AND.W    #$0FFF,D1
  1027.     BNE.S    mt_rtnend
  1028.     MOVEQ    #0,D1
  1029.     MOVE.B    mt_counter(PC),D1
  1030. mt_rtnskp    DIVU    D0,D1
  1031.     SWAP    D1
  1032.     TST.W    D1
  1033.     BNE.S    mt_rtnend
  1034. mt_DoRetrig
  1035.     MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1036.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1037.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1038.     
  1039.     bsr    mt_WaitDMA
  1040.  
  1041.     MOVE.W    n_dmabit(A6),D0
  1042.     BSET    #15,D0
  1043.     MOVE.W    D0,$DFF096
  1044.     
  1045.     bsr    mt_WaitDMA
  1046.  
  1047.     MOVE.L    n_loopstart(A6),(A5)
  1048.     MOVE.L    n_replen(A6),4(A5)
  1049. mt_rtnend    MOVE.L    (SP)+,D1
  1050.     RTS
  1051.  
  1052. mt_VolumeFineUp
  1053.     TST.B    mt_counter
  1054.     BNE    mt_Return
  1055.     MOVEQ    #0,D0
  1056.     MOVE.B    n_cmdlo(A6),D0
  1057.     AND.B    #$F,D0
  1058.     BRA    mt_VolSlideUp
  1059.  
  1060. mt_VolumeFineDown
  1061.     TST.B    mt_counter
  1062.     BNE    mt_Return
  1063.     MOVEQ    #0,D0
  1064.     MOVE.B    n_cmdlo(A6),D0
  1065.     AND.B    #$0F,D0
  1066.     BRA    mt_VolSlideDown2
  1067.  
  1068. mt_NoteCut
  1069.     MOVEQ    #0,D0
  1070.     MOVE.B    n_cmdlo(A6),D0
  1071.     AND.B    #$0F,D0
  1072.     CMP.B    mt_counter(PC),D0
  1073.     BNE    mt_Return
  1074.     CLR.B    n_volume(A6)
  1075.     MOVE.W    #0,8(A5)
  1076.     RTS
  1077.  
  1078. mt_NoteDelay
  1079.     MOVEQ    #0,D0
  1080.     MOVE.B    n_cmdlo(A6),D0
  1081.     AND.B    #$0F,D0
  1082.     CMP.B    mt_Counter,D0
  1083.     BNE    mt_Return
  1084.     MOVE.W    (A6),D0
  1085.     BEQ    mt_Return
  1086.     MOVE.L    D1,-(SP)
  1087.     BRA    mt_DoRetrig
  1088.  
  1089. mt_PatternDelay
  1090.     TST.B    mt_counter
  1091.     BNE    mt_Return
  1092.     MOVEQ    #0,D0
  1093.     MOVE.B    n_cmdlo(A6),D0
  1094.     AND.B    #$0F,D0
  1095.     TST.B    mt_PattDelTime2
  1096.     BNE    mt_Return
  1097.     ADDQ.B    #1,D0
  1098.     MOVE.B    D0,mt_PattDelTime
  1099.     RTS
  1100.  
  1101. mt_FunkIt
  1102.     TST.B    mt_counter
  1103.     BNE    mt_Return
  1104.     MOVE.B    n_cmdlo(A6),D0
  1105.     AND.B    #$0F,D0
  1106.     LSL.B    #4,D0
  1107.     AND.B    #$0F,n_glissfunk(A6)
  1108.     OR.B    D0,n_glissfunk(A6)
  1109.     TST.B    D0
  1110.     BEQ    mt_Return
  1111. mt_UpdateFunk
  1112.     MOVEM.L    A0/D1,-(SP)
  1113.     MOVEQ    #0,D0
  1114.     MOVE.B    n_glissfunk(A6),D0
  1115.     LSR.B    #4,D0
  1116.     BEQ.S    mt_funkend
  1117.     LEA    mt_FunkTable(PC),A0
  1118.     MOVE.B    (A0,D0.W),D0
  1119.     ADD.B    D0,n_funkoffset(A6)
  1120.     BTST    #7,n_funkoffset(A6)
  1121.     BEQ.S    mt_funkend
  1122.     CLR.B    n_funkoffset(A6)
  1123.  
  1124.     MOVE.L    n_loopstart(A6),D0
  1125.     MOVEQ    #0,D1
  1126.     MOVE.W    n_replen(A6),D1
  1127.     ADD.L    D1,D0
  1128.     ADD.L    D1,D0
  1129.     MOVE.L    n_wavestart(A6),A0
  1130.     ADDQ.L    #1,A0
  1131.     CMP.L    D0,A0
  1132.     BLO.S    mt_funkok
  1133.     MOVE.L    n_loopstart(A6),A0
  1134. mt_funkok
  1135.     MOVE.L    A0,n_wavestart(A6)
  1136.     MOVEQ    #-1,D0
  1137.     SUB.B    (A0),D0
  1138.     MOVE.B    D0,(A0)
  1139. mt_funkend
  1140.     MOVEM.L    (SP)+,A0/D1
  1141.     RTS
  1142.  
  1143.  
  1144. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1145.  
  1146. mt_VibratoTable    
  1147.     dc.b   0, 24, 49, 74, 97,120,141,161
  1148.     dc.b 180,197,212,224,235,244,250,253
  1149.     dc.b 255,253,250,244,235,224,212,197
  1150.     dc.b 180,161,141,120, 97, 74, 49, 24
  1151.  
  1152. mt_PeriodTable
  1153. ; Tuning 0, Normal
  1154.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1155.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1156.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1157. ; Tuning 1
  1158.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1159.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1160.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1161. ; Tuning 2
  1162.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1163.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1164.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1165. ; Tuning 3
  1166.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1167.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1168.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1169. ; Tuning 4
  1170.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1171.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1172.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1173. ; Tuning 5
  1174.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1175.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1176.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1177. ; Tuning 6
  1178.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1179.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1180.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1181. ; Tuning 7
  1182.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1183.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1184.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1185. ; Tuning -8
  1186.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1187.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1188.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1189. ; Tuning -7
  1190.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1191.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1192.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1193. ; Tuning -6
  1194.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1195.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1196.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1197. ; Tuning -5
  1198.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1199.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1200.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1201. ; Tuning -4
  1202.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1203.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1204.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1205. ; Tuning -3
  1206.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1207.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1208.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1209. ; Tuning -2
  1210.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1211.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1212.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1213. ; Tuning -1
  1214.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1215.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1216.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1217.  
  1218. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1219. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,0,0,0,0
  1220. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,0,0,0,0
  1221. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,0,0,0,0
  1222.  
  1223. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1224.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1225.  
  1226. mt_SongDataPtr    dc.l 0
  1227. mt_speed        dc.b 6
  1228. mt_counter        dc.b 0
  1229. mt_SongPos        dc.b 0
  1230. mt_PBreakPos    dc.b 0
  1231. mt_PosJumpFlag    dc.b 0
  1232. mt_PBreakFlag    dc.b 0
  1233. mt_LowMask        dc.b 0
  1234. mt_PattDelTime    dc.b 0
  1235. mt_PattDelTime2    dc.b 0
  1236. mt_Enable        dc.b 0
  1237. mt_PatternPos    dc.w 0
  1238. mt_DMACONtemp    dc.w 0
  1239. ciatime2:        dc.l 0
  1240.  
  1241. ;/* End of File */
  1242.  
  1243.     section    mtdata,data_c
  1244.  
  1245. mt_data:    incbin    "dh0:data/joes/mods/mod.joes#10"
  1246.  
  1247.  
  1248.